package net.wasdev.twelvefactorapp.it.test; import static org.junit.Assert.*; import net.wasdev.twelvefactorapp.ResponseHandler.RequestType; import org.junit.BeforeClass; import org.junit.Test; import org.junit.Before; import org.junit.After; import org.junit.Assume; import javax.json.Json; import javax.json.JsonObject; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * This tests that sending GET, PUT and POST requests to the JaxrsHttpReceiver class * don't return exceptions. */ public class EndpointTest { private static String port; private static String contextRoot; private String testDatabase = "testing"; private boolean databaseConfigured = false; @BeforeClass public static void beforeClass() { port = System.getProperty("liberty.test.port"); contextRoot = "http://localhost:" + port + "/12-factor-application/"; } @Before public void setup() { // Database config must be stored in local environment variables databaseConfigured = System.getenv("dbUsername") != null && System.getenv("dbPassword") != null && System.getenv("dbUrl") != null; String url = contextRoot; System.out.println("Creating database"); Entity<String> ent = Entity.entity(testDatabase, MediaType.APPLICATION_JSON); Response response = sendRequest(url, RequestType.PUT, ent); System.out.println("Creating database status: " + response.getStatus()); response.close(); } @After public void cleanUp() { String url = contextRoot + testDatabase; System.out.println("Deleting database"); Response response = sendRequest(url, RequestType.DELETE); response.close(); } @Test public void testGet() { Assume.assumeTrue(databaseConfigured); String url = contextRoot; System.out.println("Testing " + url); Response response = sendRequest(url, RequestType.GET); String responseString = response.readEntity(String.class); int responseCode = response.getStatus(); response.close(); System.out.println("Returned " + responseString); assertTrue("Incorrect response code: " + responseCode + " Response string is " + responseString, responseCode == 200); } @Test public void testGetDatabase() { Assume.assumeTrue(databaseConfigured); String url = contextRoot + testDatabase; System.out.println("Testing " + url); Response response = sendRequest(url, RequestType.GET); String responseString = response.readEntity(String.class); int responseCode = response.getStatus(); response.close(); System.out.println("Returned " + responseString); assertTrue("Incorrect response code: " + responseCode + " Response string is " + responseString, responseCode == 200); } @Test public void testPost() { Assume.assumeTrue(databaseConfigured); String url = contextRoot + testDatabase; System.out.println("Testing " + url); JsonObject data = Json.createObjectBuilder().add("weather", "sunny").build(); String dataString = data.toString(); Entity<String> ent = Entity.entity(dataString, MediaType.APPLICATION_JSON); Response response = sendRequest(url, RequestType.POST, ent); String responseString = response.readEntity(String.class); int responseCode = response.getStatus(); response.close(); System.out.println("Returned " + responseString); assertTrue("Incorrect response code: " + responseCode + " Response string is " + responseString, responseCode == 200); } // If the database configuration cannot be reached make sure the app fails gracefully @Test public void testDatabaseNotConfigured() { Assume.assumeFalse(databaseConfigured); String url = contextRoot; System.out.println("Testing " + url); Response response = sendRequest(url, RequestType.GET); String responseString = response.readEntity(String.class); int responseCode = response.getStatus(); response.close(); System.out.println("Returned " + responseString); assertTrue("Incorrect response code: " + responseCode + " Response string is " + responseString, responseCode == 500); assertTrue("Application returned error: " + responseString, responseString.contains("{\"Exception\":\"Database cannot be accessed at this time")); } public Response sendRequest(String url, RequestType requestType) { return sendRequest(url, requestType, null); } public Response sendRequest(String url, RequestType requestType, Entity<?> ent) { Client client = ClientBuilder.newClient(); System.out.println("Testing " + url); WebTarget target = client.target(url); Invocation.Builder invoBuild = target.request(); Response response = invoBuild.build(requestType.toString(), ent).invoke(); return response; } }